LpNormalization
对输入张量按 实例(Instance)+ 通道(Channel) 维度执行 Lp 归一化操作。
该算子在每个样本的每个通道内,基于 inner_size 维度计算 Lp 范数,
并结合可学习参数 gamma 与 beta 完成缩放与偏移。
\[ \begin{align}\begin{aligned}\text{norm}_{b,c} = \left( \sum_{i=1}^{N} |x_{b,c,i}|^p + \epsilon \right)^{\frac{1}{p}}\\y_{b,c,i} = \frac{x_{b,c,i}}{\text{norm}_{b,c}} \cdot \gamma_c + \beta_c\end{aligned}\end{align} \]
其中:
\(b\) 表示 batch 维度
\(c\) 表示通道维度
\(i\) 表示
inner_size维度\(p\) 为范数阶数
\(\gamma_c\)、\(\beta_c\) 为通道级缩放与偏移参数
- 输入:
input - 输入数据地址,形状为
[batch, channel, inner_size]。- params - 参数打包成数组:
gamma - 缩放参数地址,长度为
channel。beta - 偏移参数地址,长度为
channel。p - Lp 范数阶数。
batch - batch 数。
channel - 通道数。
inner_size - 每个通道内的归一化长度。
epsilon - 数值稳定因子。
core_mask - 核掩码(仅适用于共享存储版本)。
- 输出:
output - LpNormalization 计算结果地址。
- 支持平台:
FT78NEMT7004
备注
FT78NE 支持
fp32类型MT7004 支持
fp16、fp32类型归一化统计量仅在单个样本、单个通道内计算
p为浮点数,可用于 L1、L2 等不同范数形式
共享存储版本:
-
void fp_lp_norm_s(float *input, long long *params, float epsilon, int core_mask)
-
void hp_lp_norm_s(half *input, long long *params, float epsilon, int core_mask)
C调用示例:
1// FT78NE 示例
2#include <stdio.h>
3#include <lpnorm.h>
4
5int main(int argc, char* argv[]) {
6 float *input = (float *)0xA0000000; // input 在 DDR 空间
7 float *output = (float *)0xC0000000;
8 float *gamma = (float *)0xA1000000;
9 float *beta = (float *)0xA2000000;
10
11 int batch = 4;
12 int channel = 64;
13 int inner_size = 256;
14 float p = 2.0f;
15 float epsilon = 1e-6f;
16 int core_mask = 0xff;
17
18 long long params[6];
19 params[0] = (long long)gamma;
20 params[1] = (long long)beta;
21 params[2] = (long long)p;
22 params[3] = (long long)batch;
23 params[4] = (long long)channel;
24 params[5] = (long long)inner_size;
25
26 fp_lp_norm_s(input, params, epsilon, core_mask);
27 return 0;
28}
私有存储版本:
-
void fp_lp_norm_p(float *input, long long *params, float epsilon)
-
void hp_lp_norm_p(half *input, long long *params, float epsilon)
C调用示例:
1// FT78NE 示例
2#include <stdio.h>
3#include <lpnorm.h>
4
5int main(int argc, char* argv[]) {
6 float *input = (float *)0x10810000; // input 在 L2 空间
7 float *output = (float *)0x10820000;
8 float *gamma = (float *)0x10830000;
9 float *beta = (float *)0x10840000;
10
11 int batch = 4;
12 int channel = 64;
13 int inner_size = 256;
14 float p = 2.0f;
15 float epsilon = 1e-6f;
16
17 long long params[6];
18 params[0] = (long long)gamma;
19 params[1] = (long long)beta;
20 params[2] = (long long)p;
21 params[3] = (long long)batch;
22 params[4] = (long long)channel;
23 params[5] = (long long)inner_size;
24
25 fp_lp_norm_p(input, params, epsilon);
26 return 0;
27}